package syg._02_activiti_suspend;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.repository.ProcessDefinition;
import org.activiti.engine.repository.ProcessDefinitionQuery;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.runtime.ProcessInstanceQuery;
import org.junit.Test;

import java.util.Date;

/**
 * 流程挂起
 * @author SYG
 */
public class _01_Suspend {

    /**
     * 挂起一个流程定义下的全部流程实例
     *
     * 这个是挂起流程,不是挂起任务
     */
    @Test
    public void test1() {
        // 1、获取流程引擎
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        // 2、获取RepositoryService(查询定义信息,因为定义属于资源,故而需要获取RepositoryService)
        RepositoryService repositoryService = processEngine.getRepositoryService();
        // 3、获取流程定义对象(这个查询对象是查所有的流程定义)
        ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery();
        // 4、根据流程定义key获取流程定义信息(为什么还可以得到一个list？一个流程部署多次的意义在哪？)
        ProcessDefinition myEvection = processDefinitionQuery.processDefinitionKey("myEvection").singleResult();
        // 5、判断当前流程定义下的所有实例是否都是挂起状态(应该所有实例挂起,则挂起)
        boolean suspended = myEvection.isSuspended();
        // 6、获取流程定义的id
        String id = myEvection.getId();
        // 7、如果是挂起状态改为激活
        if (suspended) {
            // 为什么还有三个参数的方法(传入true表示激活的那个),直接激活不就好了？
            // repositoryService.activateProcessDefinitionById(id);
            repositoryService.activateProcessDefinitionById(id, true, new Date());
            System.out.println("流程定义id=" + id + "已激活");
        } else {
            // 为什么还有三个参数的方法(传入true表示挂起的那个),直接挂起不就好了？
            // repositoryService.suspendProcessDefinitionById(id);
            repositoryService.suspendProcessDefinitionById(id, true, new Date());
            System.out.println("流程定义id=" + id + "已挂起");
        }

    }

    /**
     * 挂起单个流程实例
     */
    @Test
    public void test2() {
        // 1,获取流程引擎
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        // 2,获取RuntimeService(实例与RuntimeService相关)
        RuntimeService runtimeService = processEngine.getRuntimeService();
        // 3,通过RuntimeService获取流程实例(这是所有的流程实例对象)
        ProcessInstanceQuery processInstanceQuery = runtimeService.createProcessInstanceQuery();
        // 4,根据流程实例id获取流程实例对象(为什么这里也可以返回一个list呢？)
        ProcessInstance instance = processInstanceQuery.processInstanceId("30001").singleResult();
        // 5,得到当前流程实例的暂停状态
        boolean suspended = instance.isSuspended();
        // 流程实例id 与 上方传入的一致
        String id = instance.getId();
        if (suspended) {
            runtimeService.activateProcessInstanceById(id);
            System.out.println("流程实例id是" + id + "已被激活");
        } else {
            runtimeService.suspendProcessInstanceById(id);
            System.out.println("流程实例id是" + id + "已被挂起");
        }

    }
}
